package persistencia.carreras.pruebas;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Date;

import modelo.carrera.Carrera;
import modelo.carrera.Conductor;
import modelo.carrera.Jugador;
import modelo.carrera.ObservadorDeCarrera;
import modelo.comportamiento.Comportamiento;
import modelo.comportamiento.Conciencia;
import modelo.escenario.Ciudad;
import modelo.escenario.ConstructorEscenario;
import modelo.geometria.Vector;
import modelo.vehiculos.Automovil;
import modelo.vehiculos.SentidoVehiculo;
import modelo.vehiculos.Vehiculo;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import persistencia.carreras.ObservadorDeCarreraPrintStream;
import persistencia.carreras.ObservadorDeCarreraSVG;

public class ObservadorDeCarreraTest {

	protected File directorio; 
	protected File directorio2; 
	@Before
	public void setUp() throws Exception {
		directorio = new File("src/persistencia/carreras/pruebas/");
		if (!directorio.exists())
			directorio.mkdirs();
	}

	@After
	public void tearDown() throws Exception {
	}

	ObservadorDeCarrera armarDeTicks(File directorio, String identificador) {
		PrintStream salida = null;
		try {
			salida = new PrintStream(directorio.getAbsoluteFile()+File.separator+"Carrera_"+identificador+".xml");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		return new ObservadorDeCarreraPrintStream(salida);
	}
	
	ObservadorDeCarrera armarCuadros(File directorio, String identificador) {
		File directorio_svg = new File(directorio.getAbsoluteFile()+File.separator+"Carrera_SVG"+identificador);
		if (!directorio_svg.exists())
			directorio_svg.mkdirs();
		return new ObservadorDeCarreraSVG(directorio_svg.getAbsolutePath());
	}
	
	protected void observarCarrera(Carrera carrera, File directorio, String identificador) {		
		carrera.addObserver(armarCuadros(directorio, identificador));
		carrera.addObserver(armarDeTicks(directorio, identificador));
	}
	
	public Carrera armarCarrera1() {
		Ciudad escenario = Ciudad.getCiudad();
		
		Date fechaCarrera = new Date();
		
		Vector puntoInicialCarrera = new Vector(45,3);
		Vector puntoFinalCarrera = new Vector(41,32);
		
		Carrera carrera = new Carrera(1, escenario, fechaCarrera, puntoInicialCarrera, puntoFinalCarrera);
		
		double anchoFitito = 3;
		double largoFitito = 2;
		double velocidadMaxFitito = 125;
		double aceleracionMaxFitito = 10;
		double frenadoMaxFitito = 10;
	
		Conductor conductorSchumacher = new Conductor(new Comportamiento());
		
		Automovil fitito = new Automovil(conductorSchumacher, puntoInicialCarrera, puntoFinalCarrera, SentidoVehiculo.OESTE, largoFitito, anchoFitito, 0, velocidadMaxFitito, aceleracionMaxFitito, frenadoMaxFitito);
		
		Jugador jugadorSchumacher = new Jugador("MichaelSchumacher", fitito);
		
		carrera.agregarJugador(jugadorSchumacher);
		
		double anchoCombi = 3;
		double largoCombi = 4;
		double velocidadMaxCombi = 145;
		double aceleracionMaxCombi = 10;
		double frenadoMaxCombi = 10;
		
		Conductor conductorMontoya = new Conductor(new Comportamiento());
		
		//Automovil combi = new Automovil(conductorMontoya, puntoInicialCarrera, puntoFinalCarrera, SentidoVehiculo.OESTE, largoCombi, anchoCombi, 0, velocidadMaxCombi, aceleracionMaxCombi, frenadoMaxCombi);
		
		/* este auto gana porque la llegada es igual a la posicion de inicio */
		Automovil combi = new Automovil(conductorMontoya, puntoInicialCarrera, puntoInicialCarrera, SentidoVehiculo.OESTE, largoCombi, anchoCombi, 0, velocidadMaxCombi, aceleracionMaxCombi, frenadoMaxCombi);
		
		Jugador jugadorMontoya = new Jugador("JuanPabloMontoya", combi);
		
		carrera.agregarJugador(jugadorMontoya);

		return carrera;
	}
	
	@Test
	public void SimularCarrera1() {
		Carrera carrera = armarCarrera1();
		observarCarrera(carrera, directorio, carrera.getIdentificador());
		carrera.iniciarCarrera();
	}

	public Carrera armarCarrera2() {
		Ciudad escenario = Ciudad.getCiudad();
		
		Date fechaCarrera = new Date();
		
		Vector puntoInicialCarrera = new Vector(45,3);
		Vector puntoFinalCarrera = new Vector(41,32);
		
		Carrera carrera = new Carrera(2, escenario, fechaCarrera, puntoInicialCarrera, puntoFinalCarrera);
		
		double anchoFitito = 1;
		double largoFitito = 1;
		double velocidadMaxFitito = 125;
		double aceleracionMaxFitito = 10;
		double frenadoMaxFitito = 10;
	
		Conductor conductorSchumacher = new Conductor(new Comportamiento());
		
		Automovil fitito = new Automovil(conductorSchumacher, puntoInicialCarrera, puntoFinalCarrera, SentidoVehiculo.OESTE, largoFitito, anchoFitito, 0, velocidadMaxFitito, aceleracionMaxFitito, frenadoMaxFitito);
		
		Jugador jugadorSchumacher = new Jugador("MichaelSchumacher", fitito);
		
		carrera.agregarJugador(jugadorSchumacher);
		
		double anchoCombi = 1;
		double largoCombi = 2;
		double velocidadMaxCombi = 145;
		double aceleracionMaxCombi = 10;
		double frenadoMaxCombi = 10;
		
		Conductor conductorMontoya = new Conductor(new Comportamiento());
		
		
		Automovil combi = new Automovil(conductorMontoya, puntoInicialCarrera, puntoFinalCarrera, SentidoVehiculo.OESTE, largoCombi, anchoCombi, 0, velocidadMaxCombi, aceleracionMaxCombi, frenadoMaxCombi);
		
		Jugador jugadorMontoya = new Jugador("JuanPabloMontoya", combi);
		
		carrera.agregarJugador(jugadorMontoya);
		
		return carrera;
	}
	
	@Test
	public void SimularCarrera2() {
		Carrera carrera = armarCarrera2();
		observarCarrera(carrera, directorio, carrera.getIdentificador());
		carrera.iniciarCarrera();
	}	
}
